package com.bwjf.dzfp.interceptor;

import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import com.bwjf.dzfp.common.base.action.BaseAction;
import com.bwjf.dzfp.common.util.DateUtil;

public class ExceptionHandler implements HandlerExceptionResolver {

	private List<String> list;

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object target, Exception ex) {
		// 在后台中输出错误异常异常信息，通过log4j输出。
		Logger log = Logger.getLogger(target.getClass());
		log.error("**************************************************************");
		log.error("请求时间: " + DateUtil.formatFullDateTime(new Date()));
		String url = request.getRequestURL().toString();
		log.error("请求url地址: " + url);
		// 判断url，如果是用xml进行交互的则获取xml报文。如果是正常的action方法则获取参数列表
		boolean bo = true;
		for (String xmlURL : list) {
			if (url.endsWith(xmlURL)) {
				log.error("请求报文: " + BaseAction.getBodyString(request));
				bo = false;
				break;
			}
		}
		if (bo) {
			log.error("请求参数: " + JSON.toJSONString(request.getParameterMap()));
		}
		log.error("发生异常的类: " + target.getClass().getName());
		log.error("异常类型: " + ex.getClass().getName());
		log.error("**************************************************************");

		// 在这里判断异常，根据不同的异常返回错误。
		if (ex.getClass().equals(DataAccessException.class)
				|| ex.getClass().equals(BadSqlGrammarException.class)) {
			log.error("数据库操作失败！", ex);
		} else if (ex.getClass().toString()
				.equals(NullPointerException.class.toString())) {
			log.error("调用了未经初始化的对象或者是不存在的对象！", ex);
		} else if (ex.getClass().equals(IOException.class)) {
			log.error("IO异常！", ex);
		} else if (ex.getClass().equals(ClassNotFoundException.class)) {
			log.error("指定的类不存在！", ex);
		} else if (ex.getClass().equals(ArithmeticException.class)) {
			log.error("数学运算异常！", ex);
		} else if (ex.getClass().equals(ArrayIndexOutOfBoundsException.class)) {
			log.error("数组下标越界!", ex);
		} else if (ex.getClass().equals(IllegalArgumentException.class)) {
			log.error("方法的参数错误！", ex);
		} else if (ex.getClass().equals(ClassCastException.class)) {
			log.error("数学运算异常！", ex);
		} else if (ex.getClass().equals(SecurityException.class)) {
			log.error("违背安全原则异常！", ex);
		} else if (ex.getClass().equals(SQLException.class)) {
			log.error("操作数据库异常！", ex);
		} else if (ex.getClass().equals(NoSuchMethodError.class)) {
			log.error("方法末找到异常！", ex);
		} else if (ex.getClass().equals(InternalError.class)) {
			log.error("Java虚拟机发生了内部错误", ex);
		} else {
			log.error("程序内部错误，操作失败！", ex);
		}
		return new ModelAndView("/error/error");
	}

	public List<String> getList() {
		return list;
	}

	public void setList(List<String> list) {
		this.list = list;
	}
}
